home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / AmigaE / Src / Guide / dragon.e < prev    next >
Text File  |  1994-12-15  |  3KB  |  114 lines

  1. MODULE 'intuition/intuition', 'graphics/view'
  2.  
  3. /* Screen size, use SIZEY=512 for a PAL screen */
  4. CONST SIZEX=640, SIZEY=400
  5.  
  6. /* Exception values */
  7. ENUM WIN=1, SCRN, STK, BRK
  8.  
  9. /* Directions (DIRECTIONS gives number of directions) */
  10. ENUM NORTH, EAST, SOUTH, WEST, DIRECTIONS
  11.  
  12. RAISE WIN  IF OpenW()=NIL,
  13.       SCRN IF OpenS()=NIL
  14.  
  15. /* Start off pointing WEST */
  16. DEF state=WEST, x, y, t
  17.  
  18. /* Face left */
  19. PROC left()
  20.   state:=Mod(state-1+DIRECTIONS, DIRECTIONS)
  21. ENDPROC
  22.  
  23. /* Move right, changing the state */
  24. PROC right()
  25.   state:=Mod(state+1, DIRECTIONS)
  26. ENDPROC
  27.  
  28. /* Move in the direction we're facing */
  29. PROC move()
  30.   SELECT state
  31.   CASE NORTH; draw(0,t)
  32.   CASE EAST;  draw(t,0)
  33.   CASE SOUTH; draw(0,-t)
  34.   CASE WEST;  draw(-t,0)
  35.   ENDSELECT
  36. ENDPROC
  37.  
  38. /* Draw and move to specified relative position */
  39. PROC draw(dx, dy)
  40.   /* Check the line will be drawn within the window bounds */
  41.   IF (x>=Abs(dx)) AND (x<=SIZEX-Abs(dx)) AND
  42.      (y>=Abs(dy)) AND (y<=SIZEY-10-Abs(dy))
  43.     Line(x, y, x+dx, y+dy, 2)
  44.   ENDIF
  45.   x:=x+dx
  46.   y:=y+dy
  47. ENDPROC
  48.  
  49. PROC main() HANDLE
  50.   DEF sptr=NIL, wptr=NIL, i, m
  51.   /* Read arguments:        [m [t [x  [y]]]] */
  52.   /* so you can say: dragon  16              */
  53.   /*             or: dragon  16 1            */
  54.   /*             or: dragon  16 1 450        */
  55.   /*             or: dragon  16 1 450 100    */
  56.   /* m is depth of dragon, t is length of lines */
  57.   /* (x,y) is the start position */
  58.   m:=Val(arg, {i})
  59.   t:=Val(arg:=arg+i, {i})
  60.   x:=Val(arg:=arg+i, {i})
  61.   y:=Val(arg:=arg+i, {i})
  62.   /* If m or t is zero use a more sensible default */
  63.   IF m=0 THEN m:=5
  64.   IF t=0 THEN t:=5
  65.   sptr:=OpenS(SIZEX,SIZEY,4,V_HIRES OR V_LACE,'Dragon Curve Screen')
  66.   wptr:=OpenW(0,10,SIZEX,SIZEY-10,
  67.               IDCMP_CLOSEWINDOW,WFLG_CLOSEGADGET,
  68.               'Dragon Curve Window',sptr,$F,NIL)
  69.   /* Draw the dragon curve */
  70.   dragon(m)
  71.   WHILE WaitIMessage(wptr)<>IDCMP_CLOSEWINDOW
  72.   ENDWHILE
  73. EXCEPT DO
  74.   IF wptr THEN CloseW(wptr)
  75.   IF sptr THEN CloseS(sptr)
  76.   SELECT exception
  77.   CASE 0
  78.     WriteF('Program finished successfully\n')
  79.   CASE WIN
  80.     WriteF('Could not open window\n')
  81.   CASE SCRN
  82.     WriteF('Could not open screen\n')
  83.   CASE STK
  84.     WriteF('Ran out of stack in recursion\n')
  85.   CASE BRK
  86.     WriteF('User aborted\n')
  87.   ENDSELECT
  88. ENDPROC
  89.  
  90. /* Draw the dragon curve (with left) */
  91. PROC dragon(m)
  92.   /* Check stack and ctrl-C before recursing */
  93.   IF FreeStack()<1000 THEN Raise(STK)
  94.   IF CtrlC() THEN Raise(BRK)
  95.   IF m>0
  96.     dragon(m-1)
  97.     left()
  98.     nogard(m-1)
  99.   ELSE
  100.     move()
  101.   ENDIF
  102. ENDPROC
  103.  
  104. /* Draw the dragon curve (with right) */
  105. PROC nogard(m)
  106.   IF m>0
  107.     dragon(m-1)
  108.     right()
  109.     nogard(m-1)
  110.   ELSE
  111.     move()
  112.   ENDIF
  113. ENDPROC
  114.